// 导入express
const express = require("express")
const router = express.Router();
const User = require("../controllers/userController")
const userObj = new User()
const Jwt = require("../common/jwt")
const aes = require("../common/aes")
const db = require("../common/db/index")
// 注册
// 请求地址：http://localhost:3001/api/user/register
// 请求方式：POST
// 参数：account, password, username, imgUrl
router.post("/register", async (req, res) => {
    let { account, password, username, gender, imgUrl, tag } = req.body;
    if (account == undefined || password == undefined || username == undefined) {
        return res.status(404).json({ code: -1, msg: "缺少参数" })
    }

    // 账号格式验证
    const accountRegex = /^[a-zA-Z0-9_]{6,20}$/;
    if (!accountRegex.test(account)) {
        return res.status(400).json({
            code: -1,
            msg: "账号格式不正确：长度6-20位，只能包含字母、数字、下划线"
        });
    }

    // 密码格式验证
    const passwordRegex = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d@$!%*?&.]{8,20}$/;
    if (!passwordRegex.test(password)) {
        return res.status(400).json({
            code: -1,
            msg: "密码格式不正确：长度8-20位，必须包含大小写字母和数字，可选特殊字符@$!%*?&."
        });
    }
    let date = new Date();//注册账号的时间
    let d1 = date.toLocaleDateString();
    let t1 = date.toLocaleTimeString();
    let createAt = d1 + " " + t1;
    await userObj.register(account, password, username, createAt, gender, imgUrl, tag)
        .then(
            result => {
                res.status(200).json(result);
            },
            err => {
                res.status(500).json(err)
            }
        )

})

// 登录
// 请求地址：http://localhost:3001/api/user/login
// 请求方式：POST
// 参数：account, password
router.post("/login", async (req, res) => {
    let { account, password } = req.body;
    if (account == undefined || password == undefined) {
        res.status(404).json({ msg: "缺少参数" })
    }
    else {
        await userObj.login(account, password)
            .then(
                result => {
                    res.status(200).json(result);
                },
                err => {
                    res.status(500).json(err)
                }
            )
    }

})

// 用户修改密码
// 请求地址：http://localhost:3001/api/user/modifyPassword
// 请求方式：POST
// 参数：oldPassword, newPassword,id
router.post('/modifyPassword', async (req, res) => {
    let { oldPassword, newPassword, id } = req.body;
    if (newPassword == undefined || id == undefined || oldPassword == undefined || oldPassword == "" || newPassword == "" || id == "") {
        return res.send({ code: -1, msg: "缺少必要参数" });
    }
    // 查询当前用户信息
    const sql = 'SELECT password FROM pre_user WHERE id = ?';
    const result = await db.query(sql, [id]);
    // console.log(result);
    if (result.length === 0) {
        return res.send({
            code: -1,
            msg: "用户不存在"
        });
    }
    // 验证旧密码是否正确
    let isOldPasswordValid = aes.aesDecrypt(oldPassword, result[0].password);
    console.log('111', isOldPasswordValid);
    if (!isOldPasswordValid) {
        return res.send({
            code: -1,
            msg: "原密码错误"
        });
    }
    if (oldPassword == newPassword) {
        return res.send({
            code: -1,
            msg: "新密码不能与旧密码相同"
        });
    }

    // 密码格式验证
    const passwordRegex = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d@$!%*?&.]{8,20}$/;
    if (!passwordRegex.test(newPassword)) {
        return res.send({
            code: -1,
            msg: "密码格式不正确：长度8-20位，必须包含大小写字母和数字，可选特殊字符@$!%*?&."
        });
    } else {
        await userObj.modifyPassword(newPassword, id)
            .then(
                result => {
                    res.status(200).json(result);
                },
                err => {
                    res.status(500).json(err)
                }
            )
    }

})

// 判断用户是否登录在线
// 请求地址：http://localhost:3001/api/user/isLogined
// 请求方式：POST
// 参数：token
router.post("/isLogined", async (req, res) => {
    // 获取token
    let token = req.headers.token || req.body.token;
    if (token == undefined) {
        res.status(404).json({ msg: "缺少参数", code: -1 })
    }
    else {
        let result = new Jwt(token).verifyToken();
        // data: 4 就是用户id
        // console.log("3",result.info);// { data: 4, iat: 1760606367, exp: 1760613567, iss: 'one' }
        if (result.code == 200) {
            res.status(200).json({ msg: "用户登录在线状态", token, code: 200 })
        }
        else {
            res.status(400).json({ msg: "用户尚未登录", code: -1 })
        }
    }
})

// 删除
// 请求地址：http://localhost:3001/api/user/remove  (自己删除自己的账号)
// 请求方式：POST
// 参数：token  
router.post("/remove", async (req, res) => {
    // 获取token
    let token = req.headers.token || req.body.token;
    if (token == undefined) {
        res.status(404).json({ msg: "缺少参数" })
    }
    else {
        let result = new Jwt(token).verifyToken();
        if (result.code == 200) {
            let id = result.info.data;// 通过token 获取用户id
            // console.log({ id })
            await userObj.remove(id)
                .then(
                    result => {
                        res.status(200).json(result);
                    },
                    err => {
                        res.status(500).json(err)
                    }
                )
        }
        else {
            res.status(400).json({ msg: "用户尚未登录" })
        }
    }
})

// 删除
// 请求地址：http://localhost:3001/api/user/delete (管理员删除用户的账号)
// 请求方式：POST
// 参数：id
router.post("/delete", async (req, res) => {
    // 获取token
    let { id } = req.body
    // 删除用户的操作
    await userObj.remove(id)
        .then(
            result => {
                res.status(200).json(result);
            },
            err => {
                res.status(500).json(err)
            }
        )
})

// 用户列表
// 请求地址：http://localhost:3001/api/user/items 
// 请求方式：POST
// 参数：page_num, page_size
router.post("/items", async (req, res) => {
    // 获取token
    let { page_num, page_size } = req.body
    if (page_num == undefined || page_size == undefined) {
        res.status(404).json({ msg: "缺少参数" })
    }
    else {
        await userObj.items(page_num, page_size)
            .then(
                result => {
                    res.status(200).json(result);
                },
                err => {
                    res.status(500).json(err)
                }
            )
    }
})

// 搜索用户
// 请求地址：http://localhost:3001/api/user/search 
// 请求方式：POST
// 参数：keyword
router.post("/search", async (req, res) => {
    // 获取token
    let { keyword } = req.body
    if (keyword == undefined) {
        res.status(404).json({ msg: "缺少参数" })
    }
    else {
        await userObj.search(keyword)
            .then(
                result => {
                    res.status(200).json(result);
                },
                err => {
                    res.status(500).json(err)
                }
            )
    }
})


// 用户修改 用户名、性别、头像、个性签名
// 请求地址：http://localhost:3001/api/user/modify  (用户自己修改)
// 请求方式：POST
// 参数：username, gender, imgUrl,tag ,id
router.post("/modify", async (req, res) => {
    // 获取token
    // 意思是可修改用户名称，性别，头像
    let { username, gender, imgUrl, tag, id } = req.body;
    if (username == undefined || gender == undefined || imgUrl == undefined || tag == undefined || id == undefined) {
        return res.status(404).json({ code: -1, msg: "缺少参数" })
    }
    await userObj.modify(username, gender, imgUrl, tag, id)
        .then(
            result => {
                res.status(200).json(result);
            },
            err => {
                res.status(500).json(err)
            }
        )

})

// 查看用户详情
// 请求地址：http://localhost:3001/api/user/detail (管理员查看)
// 请求方式：POST
// 参数：id 
router.post("/detail", async (req, res) => {
    // 获取token
    let { id } = req.body
    await userObj.detail(id)
        .then(
            result => {
                res.status(200).json(result);
            },
            err => {
                res.status(500).json(err)
            }
        )
})


// 查看用户详情
// 请求地址：http://localhost:3001/api/user/detail2 (用户自己查看)
// 请求方式：POST
// 参数：token
router.post("/detail2", async (req, res) => {
    // 获取token
    let token = req.headers.token || req.body.token;
    if (token == undefined) {
        res.status(404).json({ msg: "缺少参数" })
    }
    else {
        let result = new Jwt(token).verifyToken();
        if (result.code == 200) {
            let id = result.info.data
            await userObj.detail(id)
                .then(
                    result => {
                        res.status(200).json(result);
                    },
                    err => {
                        res.status(500).json(err)
                    }
                )
        }
        else {
            res.status(400).json({ msg: "您尚未登录" })
        }
    }
})

// 查看用户列表
// 请求地址：http://localhost:3001/api/user/list
// 请求方式：POST
// 参数：无
router.post('/list', async (req, res) => {
    await userObj.list().then(
        result => {
            res.status(200).json(result)
        },
        err => {
            res.status(500).json(err)
        }
    )
})
// 挂载到模块系统对象上
module.exports = router;